package com.example.superyi.myteam.roomPro.databasePro;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

import com.example.superyi.myteam.roomPro.dao.AuthorEntityDao;
import com.example.superyi.myteam.roomPro.entityPro.AuthorEntity;

/**
 * Database中的3个参数依次为
 * 1、实体类，也就是保存的数据库表，如果有多个，那么都放在{}中即可
 * 2、数据库版本，当数据库的字段发生改变时使用
 * 3、false就得了
 */

@Database(entities = {AuthorEntity.class},version = 3,exportSchema = false)
abstract public class MyDataBasePro extends RoomDatabase {
    /**
     * A singleton instance of database.
     */
    private static MyDataBasePro INSTANCE;

    /**
     * 获取本地数据库的一个单一实例，因为获取一个实例的资源消耗很大.
     *
     * @param context application context
     *                For example, context.getApplicationContext();
     * @return an instance of native database named MyDatabase
     */
    public static synchronized MyDataBasePro getInstance(Context context){
        if(INSTANCE==null){
            INSTANCE= Room.databaseBuilder(context, MyDataBasePro.class, "MyDataBasePro")
                    .fallbackToDestructiveMigration()
                    .addMigrations(MIGRATION_2_3)
                    .build();
        }
        return INSTANCE;
    }

    /**
     * 每次升级数据库号的变化X——Y
     * 同时给出数据库表的变化
     */
    static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //说明从2到3数据库结构的变化，然后在getInstance中  .addMigrations(MIGRATION_2_3)
//            database.execSQL("ALTER TABLE User ADD COLUMN xxx TEXT");
        }
    };

    /**
     * 如果是删除表中的字段，由于SQLite是轻量级数据库，没有drop表字段的功能，需要：
     * 1，创建临时的表
     * 2，复制原先表中的数据
     * 3，删除原先的表
     * 4，将临时的表改成原先表的名字
     */
    static final Migration MIGRATION_3_4 = new Migration(3, 4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE Pro_temp (questionId INTEGER PRIMARY KEY NOT NULL)");//1
            database.execSQL("INSERT INTO Pro_temp(questionId)" +
                    "SELECT questionId FROM problemInfo");//2
            database.execSQL("DROP TABLE problemInfo");//3
            database.execSQL("ALTER TABLE Pro_temp RENAME TO problemInfo");//4
        }
    };

    /**
     * 获取一个authorEntityDao对象
     *
     * @return an instance of authorEntityDao
     */
    public abstract AuthorEntityDao getAuthorEntityDao();
}
